<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>JS函数</title>
</head>
<body>
    <h1>JS函数</h1>
    <hr>
        
    <script>
        // 自执行
        (function(){console.log(1)})();
        (function(){console.log(2)}());


        // 闭包
        // 概念:
        // 相当于在函数内部有一个子函数 这个子函数可以调用函数的局部变量并且能够执行相应的方法运算 从而将这个局部变量或者已经经过处理的局部变量返回到全局 以便其他函数使用;
        // 
        // 因为 局部可以访问全局 但全局可以访问局部 所以 就用闭包来实现呢 全局访问局部间接的
        // 最大的两个用途
        // 1. 一个是前面提到的可以读取函数内部的变量
        // 2. 另一个就是让这些变量的值始终保持在内存中，不会在f1调用后被自动清除。
        // 
        // 1, 
        /*function fun1(){
            var a = 5 ;
            function fun2(){
                // 100 行代码;
                console.log(a);   // 执行fun2方法 处理局部变量a;

            }
            return fun2;     // 返回fun2 就是 返回 fun2这个 结构 并不是 返回 fun2的值   以便 在全局 使用;
        }

        var result = fun1();
        console.log(result);
        result();   // 本质是调用 fun2 这个函数;
        //  => fun1()();*/

 
        // 2
        /*function fun1(a){         // 将局部变量当做参数 ;
            function fun2(){
                // 100 CODE
                console.log(a * 10);
            }
            return fun2;
        }

        var result1 = fun1(10);
        var result2 = fun1(20);
        var result3 = fun1(30);
        result1();
        result2();
        result3();*/  



        // 3. 最终
        function fun1(a){
            return (function(){
                a /= 10;
                console.log(a); // return 输出相当于直接进行自执行的算 而如果接受这个方法的值的话 则会显示undefined 这样 就能确保内部代码执行不被直接输出出来
            })();
        }  

            fun1(10);
            fun1(20);
            fun1(30);
    

    </script>
    

</body>
</html>